<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>03_组合继承</title>
</head>
<body>
<!-- 
方式3：组合继承 ==> 原型链继承 + 借用构造方法继承
    * 利用原型链实现对父类型方法的继承
    * 利用父类型.call()或者父类型.apply()方法初始化子类中相同的属性
-->
<script>
// 定义父类型构造函数
function Aminial(name, age) {
    this.name = name
    this.age = age
}

// 给父类型的原型添加方法
Aminial.prototype.sleep = function() {
    console.log(this.name + ' 睡觉了...')
}

// 定义子类型的构造函数
function Dog(name, age, color) {
    // 调用父类的构造方法
    // Aminial.call(this, name, age)
    Aminial.apply(this, [name, age])
    this.color = color
}

// 创建父类型的对象赋值给子类型的原型
Dog.prototype = new Aminial()

// 将子类型原型的构造属性设置为子类型
Dog.prototype.constructor = Dog

// 给子类型原型添加方法
Dog.prototype.eat = function() {
    console.log('eat:',this.name, this.age, this.color)
}

// 创建子类型对象，调用父类的方法
var dog = new Dog("大黄", 4, "黑色")
console.log(dog)
dog.sleep() // 大黄 睡觉了...
dog.eat() // eat: 大黄 4 黑色

</script>
</body>
</html>